package async;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;

/**
 * @Author: linKe
 * @Date: 2022/1/14 17:28
 * @FileName: AsyncExecutor
 * @version: 1.0
 * @Description: 异步执行接口
 */
public interface AsyncExecutor {

    /**
     * 开启过程任务
     * @param task  可调用任务
     * @param <T>   泛型
     * @return  结果
     */
    <T> AsyncResult<T> startProcess(Callable<T> task);

    /**
     * 开启过程任务
     * @param task 可调用任务
     * @param callback  异步回调接口对象
     * @param <T>   泛型
     * @return  结果
     */
    <T> AsyncResult<T> startProcess(Callable<T> task, AsyncCallback<T> callback);

    /**
     * 返回最终的结果，如果此时尚未完成，那么当前线程会被阻塞
     * @param result 异步结果
     * @return 执行结果
     * @throws InterruptedException 执行中断异常
     * @throws ExecutionException   执行异常
     */
    <T> T endProcess(AsyncResult<T> result) throws InterruptedException, ExecutionException;

}
